package com.xiaojiezhu.netty.base.demo.timer;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

/**
 * 作者 zxj<br>
 * 时间 2017/7/14 11:31
 * 说明 ...
 */
public class TimerServerHandler extends ChannelInboundHandlerAdapter {

    /**
     * channelActive() 方法将会是在连接被建立，并且准备通信时被调用，因此在这里直接返回给客户端消息，并且关闭连接
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(final ChannelHandlerContext ctx) throws Exception {
        System.out.println("active");
        final ByteBuf buf = ctx.alloc().buffer(4);//得到一个缓冲区
        buf.writeInt((int) (System.currentTimeMillis() / 1000L + 2208988800L));

        //写入并且刷新缓冲区。这个发送是异步的，所以得到了一个ChannelFuture对象，在这个对象设计监听器，可以得到发送成功的状态
        //举个例子，如下的操作，就可能在发送消息之前关闭连接
//        Channel ch = ..
//        ch.WriteAndFlush(..);
//        ch.close();
        final ChannelFuture f = ctx.writeAndFlush(buf);
        f.addListener(new ChannelFutureListener() {
            public void operationComplete(ChannelFuture future) throws Exception {
                assert f == future;
                ctx.close();
            }
        });
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("in active");
    }

    @Override
    public void channelRead(final ChannelHandlerContext ctx, Object msg) throws Exception {

    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}
